﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.Objects;
using System.Linq;
using RazakiBLL.Entities;

namespace RazakiBLL.Managers
{
    public class MessageForumRps : RpsRazaki<MessageForum>
    {
        public MessageForumRps(ObjectContext context)
            : base(context)
        {
        }

        public dynamic GetWithDetailById(int id)
        {
            var linq = (from mss in _objectSet
                        select new
                        {
                            mss.Id,
                            mss.ParentId,
                            mss.Subject,
                            mss.Text,
                            mss.UserId,
                            mss.aspnet_Users.UserDetail.Sex,
                            mss.aspnet_Users.UserDetail.Picture,
                            mss.CreatedDate
                        });

            linq = (from mss in linq where mss.Id == id select mss);

            return linq.SingleOrDefault<object>().ExpandoRecord();
        }

        public IList GetWithDetailByParentId(int parentId)
        {
            var linq = (from mss in _objectSet
                        select new
                        {
                            mss.Id,
                            mss.ParentId,
                            mss.Subject,
                            mss.Text,
                            mss.UserId,
                            mss.aspnet_Users.UserDetail.Sex,
                            mss.aspnet_Users.UserDetail.Picture,
                            mss.CreatedDate
                        });

            //به
            //data bound list.
            //ارسال می شود.
            linq = (from mss in linq where mss.ParentId == parentId select mss);

            return linq.ToList();
        }

        /// <summary>
        /// پیام های عمومی و پیام های خصوصی
        /// </summary>
        /// <returns></returns>
        public IList GetAllPublicOrPrivate(int permissionId, Guid? userId)
        {
            var linq = (from mF in _objectSet
                        where mF.ParentId == null && mF.PermissionId == permissionId
                        orderby mF.CreatedDate descending
                        select new
                        {
                            mF.Id,
                            mF.UserId,
                            mF.Subject,
                            mF.CreatedDate,
                            mF.MessageType.Description
                        });
            if (userId.HasValue)
                linq = (from mF in linq where mF.UserId == userId select mF);

            //دلیل آنکه از 
            //Expando()
            //استقاده نشده این است که 
            //data bound list
            //خودشان عمل 
            //Expando()
            //را انجام می دهند.
            //و این قابلیت را پشتیبانی نمیکنند.
            return linq.ToList();
        }

        public IList GetAllPrivate(MessagePermissionRps messagePermissionRps)
        {
            var privatePermissionId = messagePermissionRps.GetByPermission(EMessagePermission.@private.ToString()).Id;

            //تمامی رکوردهای خصوصی را برمی گرداند
            return GetAllPublicOrPrivate(privatePermissionId, null);
        }

        public IList GetUserAllPrivate(MessagePermissionRps messagePermissionRps, Guid userId)
        {
            var privatePermissionId = messagePermissionRps.GetByPermission(EMessagePermission.@private.ToString()).Id;

            //تمامی رکوردهای خصوصی مربوط به کاربر جاری برمی گرداند
            return GetAllPublicOrPrivate(privatePermissionId, userId);
        }

        public IList GetAllPublic(MessagePermissionRps messagePermissionRps)
        {
            var privatePermissionId = messagePermissionRps.GetByPermission(EMessagePermission.@public.ToString()).Id;

            return GetAllPublicOrPrivate(privatePermissionId, null);
        }

    }
}
